/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hyperbeam.Lector;
import hyperbeam.Figuras.*;
import hyperbeam.Estructuras.*;
import org.jdom.*;
import java.io.File;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
/**
 *
 * @author Programmer
 */
public class Lector {
    /**
     * Obtiene el nombre del archivo objetivo
     * @param filename
     * @return
     */
    public static String getFilename(String filename){
        String result = null;
        try{
            org.jdom.Document doc = new org.jdom.input.SAXBuilder().build(new File(filename));
            Element root = doc.getRootElement();
            result = root.getChild("Archivo").getAttributeValue("Imagen");
        }
        catch(JDOMException ex){
            System.out.println("Error en el XML "+ ex.getMessage());
         }
         catch(java.io.IOException ex){
             System.out.println("Error de IO "+ ex.getMessage());
         }
        return result;
    }


    /**
     * Carga todos los datos de la escena
     * @param filename
     * @param Camara
     * @param dms
     * @param luces
     * @param figuras
     * @param materiales
     */
    public static void cargarConfiguracionEscena(String filename, Dimension dms,Punto3D Camara, 
                                                 LinkedList<Luz> luces, LinkedList<Figura> figuras,
                                                 Hashtable<String,Material> materiales){
         try{
            org.jdom.Document doc = new org.jdom.input.SAXBuilder().build(new File(filename));
            Element root = doc.getRootElement();
            Element child;

            ///Leemos la configuración
            child = root.getChild("Config");
            CargarConfiguracion(child,dms,Camara);
            
            //Luces
            child = root.getChild("Luces");
            CargarLuces(child, luces);
            
            //<editor-fold defaultstate="collapsed" desc="Figuras">
            child = root.getChild("Figuras");              
            Element nodoFigura = child.getChild("Esferas"),current = null;
            CargarEsferas(nodoFigura, current,figuras);
            current = null;
            //</editor-fold>

            //Materiales
            child = root.getChild("Materiales");
            LeerMateriales(child, current, materiales);
            

         }
         catch(JDOMException ex){
            System.out.println("Error en el XML "+ ex.getMessage());
         }
         catch(java.io.IOException ex){
             System.out.println("Error de IO "+ ex.getMessage());
         }

    }

    ///Leemos la configuración
    //<editor-fold defaultstate="collapsed" desc="Configuración">
    /**
     * Carga las configuraciones de las dimensiones y de la camara
     * @param child
     * @param dms
     * @param Camara
     */

    public static void CargarConfiguracion(Element child,Dimension dms, Punto3D Camara){
        Element dimension = child.getChild("Dimensiones");
        dms.setDimensionesImagen(Integer.parseInt(dimension.getAttributeValue("Ancho")), Integer.parseInt(dimension.getAttributeValue("Alto")));
        dms.setDimensionesX(Double.parseDouble(dimension.getAttributeValue("xMin")), Double.parseDouble(dimension.getAttributeValue("xMax")));
        dms.setDimensionesY(Double.parseDouble(dimension.getAttributeValue("yMin")), Double.parseDouble(dimension.getAttributeValue("yMax")));
        dms.setDimensionesZ(Double.parseDouble(dimension.getAttributeValue("zMin")), Double.parseDouble(dimension.getAttributeValue("zMax")));
        Element ojo       = child.getChild("Camara");
        Camara.setXYZ(Double.parseDouble(ojo.getAttributeValue("Xe")), Double.parseDouble(ojo.getAttributeValue("Ye")), Double.parseDouble(ojo.getAttributeValue("Ze")));
        ojo = null;
        dimension = null;
    }
    //</editor-fold>

    //Leemos los datos de las luces
    //<editor-fold defaultstate="collapsed" desc="Luces">
      /**
       * Carga e inicializa los datos de las luces de la escena
       * @param child
       * @param luces
       */
     public static void CargarLuces(Element child, LinkedList<Luz> luces){
            List<Element> hijos = child.getChildren();
            Element current = null;
            double xl, yl, zl, intensidad, C1, C2, C3;
            int rl, gl, bl;
            for (int index = 0; index < hijos.size(); index++){
                current = hijos.get(index);
                xl = Double.parseDouble(current.getAttributeValue("Xl"));
                yl = Double.parseDouble(current.getAttributeValue("Yl"));
                zl = Double.parseDouble(current.getAttributeValue("Zl"));
                rl = Integer.parseInt(current.getAttributeValue("R"));
                gl = Integer.parseInt(current.getAttributeValue("G"));
                bl = Integer.parseInt(current.getAttributeValue("B"));
                intensidad = Double.parseDouble(current.getAttributeValue("Intensidad"));
                C1 = Double.parseDouble(current.getAttributeValue("C1"));
                C2 = Double.parseDouble(current.getAttributeValue("C2"));
                C3 = Double.parseDouble(current.getAttributeValue("C3"));
                Luz newLight = new Luz(xl,yl,zl, rl, gl, bl,intensidad);
                newLight.setAtenuacion(C1, C2, C3);
                luces.add(newLight );
            }
            current = null;
     }
     //</editor-fold>

     //Leemos los datos de las esferas
     //<editor-fold defaultstate="collapsed" desc="Esferas">
     public static void CargarEsferas(Element nodoFigura, Element current, LinkedList<Figura> figuras){
            double Xc, Yc, Zc, radio;
            List<Element> hijos = nodoFigura.getChildren();
            Esfera nuevaEsfera;
            for (int index = 0; index < hijos.size(); index++){
                current = hijos.get(index);
                Xc    = Double.parseDouble(current.getAttributeValue("Xc"));
                Yc    = Double.parseDouble(current.getAttributeValue("Yc"));
                Zc    = Double.parseDouble(current.getAttributeValue("Zc"));
                radio = Double.parseDouble(current.getAttributeValue("Radio"));
                nuevaEsfera = new Esfera(Xc, Yc, Zc, radio);
                nuevaEsfera.setIdMaterial(current.getAttributeValue("Material"));
                nuevaEsfera.setIdTexture(current.getAttributeValue("Textura"));
                nuevaEsfera.setIdBumpmap(current.getAttributeValue("Bumpmap"));
                figuras.add(nuevaEsfera);
            }
     }
     //</editor-fold>

     //Leemos los materiales
     //<editor-fold defaultstate="collapsed" desc="Materiales">
     public static void LeerMateriales(Element child, Element current, Hashtable<String,Material> materiales){
            int red, green, blue;
            double cRefraccion, cReflexionDif, cEspecular, cAbsorcionSo, cTransparencia,Kn;
            List<Element> hijos = child.getChildren();
            for (int index = 0; index < hijos.size(); index++){
                current = hijos.get(index);
                red =   Integer.parseInt(current.getAttributeValue("cRed"));
                green = Integer.parseInt(current.getAttributeValue("cGreen"));
                blue =  Integer.parseInt(current.getAttributeValue("cBlue"));
                cRefraccion    = Double.parseDouble(current.getAttributeValue("ReflexDif"));
                cReflexionDif  = Double.parseDouble(current.getAttributeValue("Refrac"));
                cEspecular     = Double.parseDouble(current.getAttributeValue("Espec"));
                cAbsorcionSo   = Double.parseDouble(current.getAttributeValue("AbsorSO"));
                cTransparencia = Double.parseDouble(current.getAttributeValue("Transp"));
                Kn             = Double.parseDouble(current.getAttributeValue("Kn"));
                materiales.put(current.getAttributeValue("id"), new Material(red, green, blue, cRefraccion, cReflexionDif, cEspecular,cAbsorcionSo,cTransparencia,Kn));
            }
     }

     //</editor-fold>
}
